package user

import (
	"go-init/dao"
	"go-init/lib/ctx"
	"go-init/lib/log"
	"go-init/lib/tool"
	"go-init/srv"
	"net/http"

	"github.com/gin-contrib/sessions"
	"github.com/gin-gonic/gin"
	jsoniter "github.com/json-iterator/go"
)

//USER user api struct
type USER struct{}

// Get
// @tags user
// @Summary 根据id获取user信息
// @Description 根据id获取user信息
// @Accept  json
// @Produce  json
// @Param id query string true "userid"
// @Success 200 {object} dao.User
// @Failure 400 {object} ctx.R
// @Router /api/user/get [get]
func (u *USER) UserGet(c *ctx.Context) {
	qs := dao.NewQs()
	qs.Add("a.id=?", c.Query("id"))
	data, err := dao.Usero(qs)
	if c.HandlerError(err) {
		log.Error(err)
		return
	}
	c.JSON(200, data)
}

// Gets
// @tags user
// @Summary 获取user列表
// @Description 获取user列表
// @Accept  json
// @Produce  json
// @Success 200 {array} dao.User
// @Failure 400 {object} ctx.R
// @Router /api/user/gets [get]
func (u *USER) UserGets(c *ctx.Context) {
	other := c.PageHandle()
	qs := dao.NewQs()
	qs.Add("a.is_delete=?", 0)
	c.QuerySet(qs, "a.user_role_id=?", "user_role_id")
	c.QuerySetLike(qs, "a.username", "username")
	data, err := dao.Users(qs, other)
	if c.HandlerError(err) {
		log.Error(err)
		return
	}
	c.JSON(200, gin.H{"data": data, "totalCount": dao.Count("user", qs)})
}

// Save
// @tags user
// @Summary 添加或更新user
// @Description 添加或更新user
// @Accept  x-www-form-urlencoded
// @Produce  json
// @Param document body dao.User true "user信息"
// @Success 200 {array} ctx.R "结果"
// @Router /api/user/save [post]
func (u *USER) UserSave(c *ctx.Context) {
	var pd dao.User
	data := c.PostForm("data")
	err := jsoniter.Unmarshal([]byte(data), &pd)
	if c.HandlerError(err) {
		log.Error(err)
		return
	}
	tool.SetDCM(&pd)
	id, err := dao.InsertOrUpdate(&pd)
	if c.HandlerError(err) {
		log.Error(err)
		return
	}
	c.JSON(200, ctx.R{Status: 1, Data: id})
}

// Login
// @tags user
// @Summary 用户登入
// @Description 用户登入
// @Accept  x-www-form-urlencoded
// @Produce  json
// @Param document body dao.User true "user信息"
// @Success 200 {array} ctx.R "结果"
// @Failure 400 {object} ctx.HTTPError
// @Router /api/user/login [post]
func (u *USER) Login(c *ctx.Context) {
	username := c.PostForm("username")
	password := c.PostForm("password")
	qs := dao.NewQs()
	qs.Add("a.is_delete=?", 0)
	qs.Add("a.username=?", username)
	data, err := dao.Usero(qs)
	if err != nil {
		log.Error(err)
		c.JSON(http.StatusOK, ctx.R{Msg: "账号或密码错误"})
		return
	}
	password = tool.ToMD5(password + data.Salt)
	if password != data.Password {
		c.JSON(http.StatusOK, ctx.R{Msg: "账号或密码错误"})
		return
	}
	session := sessions.Default(c.Copy())
	session.Set("user", data.Id)
	_ = session.Save()
	//插入登入记录
	//var ulr dao.UserLoginRecord
	//c.SetDCM(&ulr)
	//ulr.UserId = data.Id
	//ulr.Ip = c.ClientIP()
	//_, err = db.DB.InsertOrUpdate(&ulr)
	//if err != nil {
	//log.Error(err)
	//}
	c.JSON(http.StatusOK, ctx.R{Status: 1})
}

// UserLogout
// @tags user
// @Summary 登出
// @Description 登出
// @Accept  json
// @Produce  json
// @Success 200 {object} ctx.R
// @Router /api/user/logout [get]
func (u *USER) Logout(c *ctx.Context) {
	session := sessions.Default(c.Copy())
	session.Delete("user")
	_ = session.Save()
	c.JSON(http.StatusOK, ctx.R{Status: 1})
}

// UserNav
// @tags user
// @Summary 根据id获取nav信息
// @Description 根据id获取nav信息
// @Accept  json
// @Produce  json
// @Success 200 {object} dao.UserNav
// @Failure 400 {object} ctx.HTTPError
// @Router /api/user/user_nav [get]
func (u *USER) UserNav(c *ctx.Context) {
	uid := c.GetUID()
	nav, auth, err := srv.UserNav(uid)
	if c.HandlerError(err) {
		log.Error(err)
		return
	}

	qs := dao.NewQs()
	qs.Add("a.id=?", uid)
	info, err := dao.Usero(qs)
	if err != nil {
		log.Error(err)
		ctx.NewError(c, http.StatusBadRequest, err)
		return
	}
	c.JSON(200, gin.H{"nav": nav, "auth": auth, "info": info})
}

// CheckLoginStatus
// @tags user
// @Summary 用户登入状态
// @Description 用户登入状态
// @Accept  json
// @Produce  json
// @Success 200 {array} ctx.R "结果"
// @Router /api/user/check_login_status [post]
func (u *USER) CheckLoginStatus(c *ctx.Context) {
	r := new(ctx.R)
	defer c.JSON(200, &r)
	if c.GetUID() == 0 {
		r.Status = 401
	} else {
		r.Status = 1
	}
}
